以下是一個簡單的範例,示範如何在一個程序中使用外部中斷、定時器中斷和ADC中斷。我們使用AVR ATmega328P MCU,並且有一個外部按鈕連接到外部中斷引腳(INT0)、一個會定期觸發的定時器中斷,以及一個用於模擬數據轉換的ADC中斷。
#include <avr/io.h>
#include <avr/interrupt.h>
// 定義中斷優先順序
#define INTERRUPT_PRIORITY_LOW 0
#define INTERRUPT_PRIORITY_MEDIUM 1
#define INTERRUPT_PRIORITY_HIGH 2
// 函式用於比較中斷的優先順序
int compareInterruptPriorities(uint8_t interrupt1, uint8_t interrupt2) {
if (interrupt1 < interrupt2) {
return -1;
} else if (interrupt1 > interrupt2) {
return 1;
} else {
return 0;
}
}
// 外部中斷處理函式
ISR(INT0_vect) {
// 外部中斷處理程序程式碼
}
// 定時器中斷處理函式
ISR(TIMER1_COMPA_vect) {
// 定時器中斷處理程序程式碼
}
// ADC中斷處理函式
ISR(ADC_vect) {
// ADC中斷處理程序程式碼
}
int main(void) {
// 初始化設定外部中斷
// ...
// 初始化設定定時器中斷
// ...
// 初始化設定ADC中斷
// ...
// 設定中斷優先級
uint8_t int0Priority = INTERRUPT_PRIORITY_LOW;
uint8_t timer1Priority = INTERRUPT_PRIORITY_MEDIUM;
uint8_t adcPriority = INTERRUPT_PRIORITY_HIGH;
// 比較中斷優先順序並設定中斷
if (compareInterruptPriorities(int0Priority, timer1Priority) > 0) {
sei(); // 啟用全域中斷
}
while (1) {
// 主程式碼
}
return 0;
}